{
 "cells": [
  {
   "cell_type": "markdown",
   "source": [
    "### 计算均值和标准差"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [
    {
     "data": {
      "text/plain": "torch.Size([3, 32, 32, 50000])"
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import torch\n",
    "from torchvision import datasets,transforms\n",
    "data_path = '../data2/p1ch7'\n",
    "cifar10 = datasets.CIFAR10(data_path,train=True,download=False,transform=transforms.Compose([\n",
    "    transforms.ToTensor()\n",
    "]))\n",
    "imgs_train = torch.stack([img_t for img_t,_ in cifar10],dim=3)\n",
    "imgs_train.shape"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-10-19T02:27:23.750349600Z",
     "start_time": "2023-10-19T02:27:11.662048700Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "outputs": [
    {
     "data": {
      "text/plain": "torch.Size([3, 32, 32, 10000])"
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cifar10_val = datasets.CIFAR10(data_path,train=False,download=False,transform=transforms.Compose(\n",
    "    [transforms.ToTensor()]\n",
    "))\n",
    "imgs_val = torch.stack([img_t for img_t,_ in cifar10_val],dim=3)\n",
    "imgs_val.shape"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-10-19T02:27:57.626065100Z",
     "start_time": "2023-10-19T02:27:55.165077Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集均值 tensor([0.4914, 0.4822, 0.4465])\n",
      "训练集标准差 tensor([0.2470, 0.2435, 0.2616])\n"
     ]
    }
   ],
   "source": [
    "# 计算训练集的均值\n",
    "train_mean=imgs_train.view(3,-1).mean(dim=1)\n",
    "# 计算训练集的标准查\n",
    "train_std = imgs_train.view(3,-1).std(dim=1)\n",
    "print('训练集均值',train_mean)\n",
    "print(\"训练集标准差\",train_std)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-10-19T02:32:03.920998Z",
     "start_time": "2023-10-19T02:32:02.578953700Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "测试集均值 tensor([0.4942, 0.4851, 0.4504])\n",
      "测试集标准差 tensor([0.2467, 0.2429, 0.2616])\n"
     ]
    }
   ],
   "source": [
    "# 计算验证集的均值和标准查\n",
    "val_mean = imgs_val.view(3,-1).mean(dim=1)\n",
    "val_std = imgs_val.view(3,-1).std(dim=1)\n",
    "print('测试集均值',val_mean)\n",
    "print('测试集标准差',val_std)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-10-19T02:36:58.386556600Z",
     "start_time": "2023-10-19T02:36:58.151558800Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "automobile\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaEAAAGdCAYAAAC7EMwUAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAjDUlEQVR4nO3df3TU9b3n8dfIjwEhGaSBzKQJMa3BXwGqQiG5KoGWLHHLitgu6q4N2z1UFOhlY2uLnKO57ZaweKTYpdDWugirFLtXsd4DAunBBD1AGygcKFiL16ChJEY4kAkBgonf/YPD1MgPv2+Y4ZOZPB/nzDky884772++IS+/ZOY9Ac/zPAEA4MBVrgcAAHRfhBAAwBlCCADgDCEEAHCGEAIAOEMIAQCcIYQAAM4QQgAAZ3q6HuCzPvnkEx06dEhpaWkKBAKuxwEAGHmep5aWFmVlZemqqy5+rdPlQujQoUPKyclxPQYA4DLV19crOzv7ojUJC6GlS5fqqaeeUkNDg26++WYtXrxYd9xxx+d+XFpamqQzw6enpydqPABAgkSjUeXk5MR+nl9MQkLopZde0pw5c7R06VL90z/9k371q1+ptLRU+/bt05AhQy76sWf/CS49PZ0QAoAk5udXKoFELDAdPXq0br31Vi1btix234033qjJkyersrLyoh8bjUYVCoXU3NxMCAFAErL8HI/7s+NOnz6tHTt2qKSkpNP9JSUl2rJlyzn1bW1tikajnW4AgO4h7iF0+PBhdXR0KDMzs9P9mZmZamxsPKe+srJSoVAoduNJCQDQfSTsdUKf/bdAz/PO+++Dc+fOVXNzc+xWX1+fqJEAAF1M3J+YkJGRoR49epxz1dPU1HTO1ZEkBYNBBYPBeI8BAEgCcb8S6t27t2677TZVVVV1ur+qqkpFRUXx/nQAgCSWkKdol5eX68EHH9TIkSNVWFioX//61/rggw80Y8aMRHw6AECSSkgITZ06VUeOHNGPf/xjNTQ0qKCgQOvWrVNubm4iPh0AIEkl5HVCl4PXCQFAcnP6OiEAAPwihAAAzhBCAABnCCEAgDOEEADAGUIIAOAMIQQAcIYQAgA4QwgBAJwhhAAAziRkdxziL+Ljvdo/7eGbbvVd+8TeHdZxuoVTa37vu7bPPXcncBIgdXElBABwhhACADhDCAEAnCGEAADOEEIAAGcIIQCAM4QQAMAZQggA4AwhBABwhhACADhDCAEAnGF3nENLR4/2Xdto7P3kvj/7rn3C2Lu7KJ8y2XftGmPvBs8zfgSQmrgSAgA4QwgBAJwhhAAAzhBCAABnCCEAgDOEEADAGUIIAOAMIQQAcIYQAgA4QwgBAJxhbY9Dy/70J9cjSJKqfv5rU/2E7303QZN0Lf9mqLWuVVr6Xx801T/ywv81fgYgOXAlBABwhhACADhDCAEAnCGEAADOEEIAAGcIIQCAM4QQAMAZQggA4AwhBABwhhACADhDCAEAnGF3nEM39v2S79q/nHwvYXNUbd5qqk/W3XFPBAKm+oMJmkOS/lLbNfYGAq5xJQQAcCbuIVRRUaFAINDpFg6H4/1pAAApICH/HHfzzTfrD3/4Q+zPPXr0SMSnAQAkuYSEUM+ePbn6AQB8roT8Tmj//v3KyspSXl6e7rvvPr333oV/qd7W1qZoNNrpBgDoHuIeQqNHj9bKlSu1YcMGPfvss2psbFRRUZGOHDly3vrKykqFQqHYLScnJ94jAQC6qLiHUGlpqe69914NGzZMX//617V27VpJ0ooVK85bP3fuXDU3N8du9fX18R4JANBFJfx1Qv369dOwYcO0f//+8z4eDAYVDAYTPQYAoAtK+OuE2tra9PbbbysSiST6UwEAkkzcQ+j73/++ampqVFdXpz/+8Y/65je/qWg0qrKysnh/KgBAkov7P8cdPHhQ999/vw4fPqxBgwZpzJgx2rZtm3Jzc+P9qZLe7078u+/agHHljMVTLz9vql/4/75hqj9c/4Hv2iceLTf1bjDUtps6J9YP/ud81yMAXULcQ2j16tXxbgkASFHsjgMAOEMIAQCcIYQAAM4QQgAAZwghAIAzhBAAwBlCCADgDCEEAHCGEAIAOEMIAQCcSfhbOSD1BP7zN031fQy1p2yjmHzFWP8DQ+3sIttuxJxv3WsbBkhRXAkBAJwhhAAAzhBCAABnCCEAgDOEEADAGUIIAOAMIQQAcIYQAgA4QwgBAJwhhAAAzrC2J55+MMtUvvW5XyRokMSaaKz/rqF2jLH3NYbaPgFb7+Oe/9qWLe/bmq/8ua3+29+z1QNJgishAIAzhBAAwBlCCADgDCEEAHCGEAIAOEMIAQCcIYQAAM4QQgAAZwghAIAzhBAAwBlCCADgTPfbHbfyZ6byW8rKfdfuMo4ywFhv8S1DrXVfW46xfpyhto+x9ylLrWEXnCR9ZKg9YGutd8v+2VR/x7p/9V+8erNxGsAdroQAAM4QQgAAZwghAIAzhBAAwBlCCADgDCEEAHCGEAIAOEMIAQCcIYQAAM4QQgAAZwghAIAzqbE7btpdvksDK15P2BjXGusPGGp7GHt/xVB7zNi70Vhfa6gdYOw9zFCbbextca2xPmKsP/bSm75ra18KmHpn3HmH79pbathLh/jiSggA4Iw5hDZv3qxJkyYpKytLgUBAr776aqfHPc9TRUWFsrKy1LdvXxUXF2vv3r3xmhcAkELMIdTa2qoRI0ZoyZIl53184cKFWrRokZYsWaLa2lqFw2FNmDBBLS0tlz0sACC1mH8nVFpaqtLS0vM+5nmeFi9erHnz5mnKlCmSpBUrVigzM1OrVq3SQw89dHnTAgBSSlx/J1RXV6fGxkaVlJTE7gsGgxo7dqy2bNly3o9pa2tTNBrtdAMAdA9xDaHGxjPPm8rMzOx0f2ZmZuyxz6qsrFQoFIrdcnKs79sJAEhWCXl2XCDQ+Sminuedc99Zc+fOVXNzc+xWX1+fiJEAAF1QXF8nFA6HJZ25IopE/vFKiKampnOujs4KBoMKBoPxHAMAkCTieiWUl5encDisqqqq2H2nT59WTU2NioqK4vmpAAApwHwldPz4cb377ruxP9fV1WnXrl0aOHCghgwZojlz5mj+/PnKz89Xfn6+5s+fr6uvvloPPPBAXAcHACQ/cwht375d48aNi/25vLxcklRWVqbnn39ejz32mE6ePKlHHnlER48e1ejRo7Vx40alpaWZPk/7D6arvXdvX7W9EriKx+JBY/1PDLUdxt7zjPXJaqShdrqx9y2G2muMvfsPsX5AH9+lBftOmVo/tdn/SqD2n/7c1HvUvO+Z6tH9mEOouLhYnudd8PFAIKCKigpVVFRczlwAgG6A3XEAAGcIIQCAM4QQAMAZQggA4AwhBABwhhACADhDCAEAnCGEAADOEEIAAGcIIQCAMwHvYjt4HIhGo2fe4E7S+d+B6FzHEjjPbEPtDcbeM431uDz/zVj/FUOtdXdcgbH+lsjn18TYVsdJd03wX/vCRmNzdEdnf443NzcrPT39orVcCQEAnCGEAADOEEIAAGcIIQCAM4QQAMAZQggA4AwhBABwhhACADhDCAEAnCGEAADO9HQ9wIU0J6hvhrE+21B70Ng7WfUx1lu3yFhcZ6gNG3unGWrbjb3/Yqxvb/BfO6yXrXefvv1sHwDEEVdCAABnCCEAgDOEEADAGUIIAOAMIQQAcIYQAgA4QwgBAJwhhAAAzhBCAABnCCEAgDOEEADAmS67Oy5RZhvrtydkijP6G2qt+9oOG+strLvgig211uO8xlCbyL2B1r10VpbddB99bOud8/Kr/osLf2Zr/p3/YatHt8OVEADAGUIIAOAMIQQAcIYQAgA4QwgBAJwhhAAAzhBCAABnCCEAgDOEEADAGUIIAOBMSqztGWmota6FqTXUWtbwSLYv/g3G3lsNtR3G3lbVhtrbjb1zDLUHjb0trOf+ljRbfbvhm+XNo7bePzPUN/73clPva//lBd+1T+zeYerdJ2QqRxfFlRAAwBlCCADgjDmENm/erEmTJikrK0uBQECvvvpqp8enTZumQCDQ6TZmzJh4zQsASCHmEGptbdWIESO0ZMmSC9ZMnDhRDQ0Nsdu6desua0gAQGoyPzGhtLRUpaWlF60JBoMKhxP9DisAgGSXkN8JVVdXa/DgwRo6dKimT5+upqamC9a2tbUpGo12ugEAuoe4h1BpaalefPFFbdq0SU8//bRqa2s1fvx4tbW1nbe+srJSoVAodsvJsTzpFgCQzOL+OqGpU6fG/rugoEAjR45Ubm6u1q5dqylTppxTP3fuXJWX/+O1B9FolCACgG4i4S9WjUQiys3N1f79+8/7eDAYVDAYTPQYAIAuKOGvEzpy5Ijq6+sViUQS/akAAEnGfCV0/Phxvfvuu7E/19XVadeuXRo4cKAGDhyoiooK3XvvvYpEIjpw4IAef/xxZWRk6J577onr4ACA5BfwPM+zfEB1dbXGjRt3zv1lZWVatmyZJk+erJ07d+rYsWOKRCIaN26cfvKTn/j+PU80GlUoZFsKNd1Qa90dt9RQ29fY+7ih9lpj7+sMtduNvY8Z67uKrxvr8xMyxRl7jPVvJWSK5PaDWU/4rl34v/8lgZPgs87+HG9ublZ6evpFa81XQsXFxbpYbm3YsMHaEgDQTbE7DgDgDCEEAHCGEAIAOEMIAQCcIYQAAM4QQgAAZwghAIAzhBAAwBlCCADgDCEEAHAm4W/lcKmGyH9C1hn6Wva1SVJHAntb1BvrMwy1xcbe1l1zB431iXLAWP+GodbyfZJoAxJYf8DYO9tQa9l3KEnHlvzYd+3WuyaZeheWjjROg0vFlRAAwBlCCADgDCEEAHCGEAIAOEMIAQCcIYQAAM4QQgAAZwghAIAzhBAAwBlCCADgTJdd2zNU/oezrMtpv4RZugLrWph3DbXWb4IbjPVdZW2P5WuSzCwrmyTpmKF2ovG7JS+Bf+MK0vr4rs3f9LytOWt7zvF21a991x5vPem7lishAIAzhBAAwBlCCADgDCEEAHCGEAIAOEMIAQCcIYQAAM4QQgAAZwghAIAzhBAAwBlCCADgTMDzPM/1EJ8WjUYVCoV0i6QeCejvf9vUGW8ZarONvbvKTjUg1Vn/bt7/paGm+oU1PzcMc9g2TOsR/7X9rD/hMg21u31XRqOnFArNV3Nzs9LT0y9ay5UQAMAZQggA4AwhBABwhhACADhDCAEAnCGEAADOEEIAAGcIIQCAM4QQAMAZQggA4ExP1wNcSLP8J+QAQ99T9lF8yzDWs7YHuDKsf9eeeu9vpvqtQyb6rv3dy1809d7+p7/7rr1uWH9T75xIlu/a/hHDip/j7b5LuRICADhjCqHKykqNGjVKaWlpGjx4sCZPnqx33nmnU43neaqoqFBWVpb69u2r4uJi7d27N65DAwBSgymEampqNHPmTG3btk1VVVVqb29XSUmJWltbYzULFy7UokWLtGTJEtXW1iocDmvChAlqaWmJ+/AAgORm+p3Q+vXrO/15+fLlGjx4sHbs2KE777xTnudp8eLFmjdvnqZMmSJJWrFihTIzM7Vq1So99NBD8ZscAJD0Lut3Qs3NzZKkgQMHSpLq6urU2NiokpKSWE0wGNTYsWO1ZcuW8/Zoa2tTNBrtdAMAdA+XHEKe56m8vFy33367CgoKJEmNjY2SpMzMzs+iyMzMjD32WZWVlQqFQrFbTk7OpY4EAEgylxxCs2bN0u7du/Xb3/72nMcCgUCnP3ued859Z82dO1fNzc2xW319/aWOBABIMpf0OqHZs2frtdde0+bNm5Wd/Y83zg2Hw5LOXBFFIpHY/U1NTedcHZ0VDAYVDAYvZQwAQJIzXQl5nqdZs2bplVde0aZNm5SXl9fp8by8PIXDYVVVVcXuO336tGpqalRUVBSfiQEAKcN0JTRz5kytWrVKv//975WWlhb7PU8oFFLfvn0VCAQ0Z84czZ8/X/n5+crPz9f8+fN19dVX64EHHkjIAQAAkpcphJYtWyZJKi4u7nT/8uXLNW3aNEnSY489ppMnT+qRRx7R0aNHNXr0aG3cuFFpaWlxGRgAkDoCnud5rof4tGg0qlAopGL5T0j/W4qk8z9H78IOGGrZHXf5nv4PXzDVP7rhSIImAfz7+k3+a/NG2Xpfl+9/H9xf3z5u6n3csEzz4z6G2o+ltb878zKe9PT0i9ayOw4A4AwhBABwhhACADhDCAEAnCGEAADOEEIAAGcIIQCAM4QQAMAZQggA4AwhBABw5pLeyuFK6Cepl8/aw4a+1rU9hq0WrOGJg0Su4cn+/JJOjhlqbctS0NUNMNb/2+IJvmv/z7qqzy/6lFGRkO/aPgds34l/MZRvfdt/bUeH/1quhAAAzhBCAABnCCEAgDOEEADAGUIIAOAMIQQAcIYQAgA4QwgBAJwhhAAAzhBCAABnCCEAgDNddndcs/wPZ9kd13IJs+DyZBhq1836gqn3qJn+d3apodnU+83f+d/xVTjqi6bePYuGm+q3/up137VFi9tNvXGuV/6Lrb7PhC/5rn2k6JvG5v5/TI/6T3+39U7r77+2wf9ex2hLh0LDd/iq5UoIAOAMIQQAcIYQAgA4QwgBAJwhhAAAzhBCAABnCCEAgDOEEADAGUIIAOAMIQQAcKbLru0JSerls/aAoW+HfRRcpo9eu9V/8aRbbM3/+jf/tfm2b/c7vuN/FYsi15t6K3uYqbywwv86o5X1z5t6f/tlU3lS2jTDdu7HLXvU+BkMy8P6ZRp79/Ff2te4tqfdsOLp2qD/2qj/vlwJAQCcIYQAAM4QQgAAZwghAIAzhBAAwBlCCADgDCEEAHCGEAIAOEMIAQCcIYQAAM4QQgAAZ7rs7ri1rgfABd1u/YDwEEOxca/WgDb/tYeNe7UaDb3TbK0lQ29JCoV8lz744j+bWj/40Hu+a9/cbPsaHj78775r7ym5ydRb95QaiofaeutDY73/3X62WqN+R4wfYPiaN1f5r2V3HAAgGZhCqLKyUqNGjVJaWpoGDx6syZMn65133ulUM23aNAUCgU63MWPGxHVoAEBqMIVQTU2NZs6cqW3btqmqqkrt7e0qKSlRa2trp7qJEyeqoaEhdlu3bl1chwYApAbT74TWr1/f6c/Lly/X4MGDtWPHDt15552x+4PBoMLhcHwmBACkrMv6nVBzc7MkaeDAgZ3ur66u1uDBgzV06FBNnz5dTU1NF+zR1tamaDTa6QYA6B4uOYQ8z1N5ebluv/12FRQUxO4vLS3Viy++qE2bNunpp59WbW2txo8fr7a28z8bqLKyUqFQKHbLycm51JEAAEnmkp+iPWvWLO3evVtvvfVWp/unTp0a+++CggKNHDlSubm5Wrt2raZMmXJOn7lz56q8vDz252g0ShABQDdxSSE0e/Zsvfbaa9q8ebOys7MvWhuJRJSbm6v9+/ef9/FgMKhg0PDe5QCAlGEKIc/zNHv2bK1Zs0bV1dXKy8v73I85cuSI6uvrFYlELnlIAEBqMv1OaObMmXrhhRe0atUqpaWlqbGxUY2NjTp58qQk6fjx4/r+97+vrVu36sCBA6qurtakSZOUkZGhe+65JyEHAABIXqYroWXLlkmSiouLO92/fPlyTZs2TT169NCePXu0cuVKHTt2TJFIROPGjdNLL72ktDTzXhMAQIoz/3PcxfTt21cbNmy4rIHOukpSwGdtR1w+I/wqtH7A/lr/tcONu+PqDbvMjtn2njXsft937SlDrSTllU0z1Sv7Fv+1wQG23hMm+C69Y4Lx/JjsM9b7309m2pEmSRpgrLfMMtzYe7OhNsvY2/B9Ffqz/9rAx75L2R0HAHCGEAIAOEMIAQCcIYQAAM4QQgAAZwghAIAzhBAAwBlCCADgDCEEAHCGEAIAOHPJ7yeUaL3E2p6u6qCx/sf/y/+6nCcO/srWfEAf/7U5tpUzaYP8916z7pSp97f1vKm+/398x39xxpdNvRUZ6r/2VLOt90e7/df2tKy+kSTD17zPv9paZxjX/BzY4r/22vtsvWX4Hjf/NDxkqB1nqD0p6WVflVwJAQCcIYQAAM4QQgAAZwghAIAzhBAAwBlCCADgDCEEAHCGEAIAOEMIAQCcIYQAAM4QQgAAZ7rs7rg21wN0IzcY67MNq8YkKSNiKLasyZKkW0b5r73Gtjuuf77/78LvXvNnU++eH1v3pBn+qjb8zdb62If+a8O2r6HaDfvd2o1fk6P+z8+xna+bWg+40bDzTpIGfcl/bet6W+9+EwzF79t6y/I1P2KoPe27kishAIAzhBAAwBlCCADgDCEEAHCGEAIAOEMIAQCcIYQAAM4QQgAAZwghAIAzhBAAwJkuu7YHV851xvoB+bb6iKX+xkJb8xzDDqG+ttb62H9pz1F32HpbVuVI0oCQ/9prh9t6W5ZktR22tc4wfF0O77P1rvO/WuejQV8wtd655++m+nFTJvovbjlk6q1+lllutfX+62r/tRn9/Ne2+F8HxJUQAMAZQggA4AwhBABwhhACADhDCAEAnCGEAADOEEIAAGcIIQCAM4QQAMAZQggA4AwhBABwht1xKWqkofagcafam3+21ecZdse1n7L17tlu+BYO5dqat77vv/Zws623/O/WOqPVf2mHbe+Z6cfA0SO21mmGuTMybb2H+d+R12enbS9d4Sjj/r2ehq9h2hBb79a/+a817ZmTFDHUfmTYMdjS4buUKyEAgDOmEFq2bJmGDx+u9PR0paenq7CwUK+//nrscc/zVFFRoaysLPXt21fFxcXau3dv3IcGAKQGUwhlZ2drwYIF2r59u7Zv367x48fr7rvvjgXNwoULtWjRIi1ZskS1tbUKh8OaMGGCWlpaEjI8ACC5mUJo0qRJuuuuuzR06FANHTpUP/3pT9W/f39t27ZNnudp8eLFmjdvnqZMmaKCggKtWLFCJ06c0KpVqxI1PwAgiV3y74Q6Ojq0evVqtba2qrCwUHV1dWpsbFRJSUmsJhgMauzYsdqyZcsF+7S1tSkajXa6AQC6B3MI7dmzR/3791cwGNSMGTO0Zs0a3XTTTWpsbJQkZWZ2foZLZmZm7LHzqaysVCgUit1ycnKsIwEAkpQ5hK6//nrt2rVL27Zt08MPP6yysjLt2/ePpz8GAoFO9Z7nnXPfp82dO1fNzc2xW319vXUkAECSMr9OqHfv3rruuuskSSNHjlRtba2eeeYZ/fCHP5QkNTY2KhL5x5PPm5qazrk6+rRgMKhgMGgdAwCQAi77dUKe56mtrU15eXkKh8OqqqqKPXb69GnV1NSoqKjocj8NACAFma6EHn/8cZWWlionJ0ctLS1avXq1qqurtX79egUCAc2ZM0fz589Xfn6+8vPzNX/+fF199dV64IEHEjU/ACCJmULoww8/1IMPPqiGhgaFQiENHz5c69ev14QJEyRJjz32mE6ePKlHHnlER48e1ejRo7Vx40alpaUlZHhc2LeG+q/NL7T13rrfVn/KsKHm2NEPTb0z3jasY2k4ZOqt9mOGWtvcsv6VsKwz2m+cpY/hx4B121CaZRVPP1vvQf5Xwxw+ZVh9I+kvW231pYP6+y9uN/764dQx/7UfvWPrfa1hPdFRw9ekp/9zYwqh55577qKPBwIBVVRUqKKiwtIWANBNsTsOAOAMIQQAcIYQAgA4QwgBAJwhhAAAzhBCAABnCCEAgDOEEADAGUIIAOCMeYt2onme53qElHDK/9YMnTht691mXN1y0tC/5eQnpt69Ww3D9PzY1Fsdht7thi+4JF343U0u0N9SbJzlY8Mw1rU9/Qxf8w7jN2KH/97HT9han7CsSZIUbTEc58fG//e37L2ynvuoYe4W/72jx8/U+vl5HvC62E/9gwcP8sZ2AJAC6uvrlZ2dfdGaLhdCn3zyiQ4dOqS0tLROb4YXjUaVk5Oj+vp6paenO5wwsTjO1NEdjlHiOFNNPI7T8zy1tLQoKytLV1118Su/LvfPcVddddVFkzM9PT2lvwHO4jhTR3c4RonjTDWXe5yhUMhXHU9MAAA4QwgBAJxJmhAKBoN68sknFQwa3xAqyXCcqaM7HKPEcaaaK32cXe6JCQCA7iNproQAAKmHEAIAOEMIAQCcIYQAAM4kTQgtXbpUeXl56tOnj2677Ta9+eabrkeKq4qKCgUCgU63cDjseqzLsnnzZk2aNElZWVkKBAJ69dVXOz3ueZ4qKiqUlZWlvn37qri4WHv37nUz7GX4vOOcNm3aOed2zJgxboa9RJWVlRo1apTS0tI0ePBgTZ48We+8806nmlQ4n36OMxXO57JlyzR8+PDYC1ILCwv1+uuvxx6/kucyKULopZde0pw5czRv3jzt3LlTd9xxh0pLS/XBBx+4Hi2ubr75ZjU0NMRue/bscT3SZWltbdWIESO0ZMmS8z6+cOFCLVq0SEuWLFFtba3C4bAmTJiglpaWKzzp5fm845SkiRMndjq369atu4ITXr6amhrNnDlT27ZtU1VVldrb21VSUqLW1tZYTSqcTz/HKSX/+czOztaCBQu0fft2bd++XePHj9fdd98dC5orei69JPDVr37VmzFjRqf7brjhBu9HP/qRo4ni78knn/RGjBjheoyEkeStWbMm9udPPvnEC4fD3oIFC2L3nTp1yguFQt4vf/lLBxPGx2eP0/M8r6yszLv77rudzJMoTU1NniSvpqbG87zUPZ+fPU7PS83z6Xmed80113i/+c1vrvi57PJXQqdPn9aOHTtUUlLS6f6SkhJt2bLF0VSJsX//fmVlZSkvL0/33Xef3nvvPdcjJUxdXZ0aGxs7nddgMKixY8em3HmVpOrqag0ePFhDhw7V9OnT1dTU5Hqky9Lc3CxJGjhwoKTUPZ+fPc6zUul8dnR0aPXq1WptbVVhYeEVP5ddPoQOHz6sjo4OZWZmdro/MzNTjY2NjqaKv9GjR2vlypXasGGDnn32WTU2NqqoqEhHjhxxPVpCnD13qX5eJam0tFQvvviiNm3apKefflq1tbUaP3682traXI92STzPU3l5uW6//XYVFBRISs3zeb7jlFLnfO7Zs0f9+/dXMBjUjBkztGbNGt10001X/Fx2uS3aF/Lpt3WQznyDfPa+ZFZaWhr772HDhqmwsFBf/vKXtWLFCpWXlzucLLFS/bxK0tSpU2P/XVBQoJEjRyo3N1dr167VlClTHE52aWbNmqXdu3frrbfeOuexVDqfFzrOVDmf119/vXbt2qVjx47p5ZdfVllZmWpqamKPX6lz2eWvhDIyMtSjR49zEripqemcpE4l/fr107Bhw7R//37XoyTE2Wf+dbfzKkmRSES5ublJeW5nz56t1157TW+88Uant1xJtfN5oeM8n2Q9n71799Z1112nkSNHqrKyUiNGjNAzzzxzxc9llw+h3r1767bbblNVVVWn+6uqqlRUVORoqsRra2vT22+/rUgk4nqUhMjLy1M4HO50Xk+fPq2ampqUPq+SdOTIEdXX1yfVufU8T7NmzdIrr7yiTZs2KS8vr9PjqXI+P+84zycZz+f5eJ6ntra2K38u4/5UhwRYvXq116tXL++5557z9u3b582ZM8fr16+fd+DAAdejxc2jjz7qVVdXe++99563bds27xvf+IaXlpaW1MfY0tLi7dy509u5c6cnyVu0aJG3c+dO7/333/c8z/MWLFjghUIh75VXXvH27Nnj3X///V4kEvGi0ajjyW0udpwtLS3eo48+6m3ZssWrq6vz3njjDa+wsND74he/mFTH+fDDD3uhUMirrq72GhoaYrcTJ07EalLhfH7ecabK+Zw7d663efNmr66uztu9e7f3+OOPe1dddZW3ceNGz/Ou7LlMihDyPM/7xS9+4eXm5nq9e/f2br311k5PmUwFU6dO9SKRiNerVy8vKyvLmzJlird3717XY12WN954w5N0zq2srMzzvDNP633yySe9cDjsBYNB78477/T27NnjduhLcLHjPHHihFdSUuINGjTI69WrlzdkyBCvrKzM++CDD1yPbXK+45PkLV++PFaTCufz844zVc7nd77zndjP00GDBnlf+9rXYgHkeVf2XPJWDgAAZ7r874QAAKmLEAIAOEMIAQCcIYQAAM4QQgAAZwghAIAzhBAAwBlCCADgDCEEAHCGEAIAOEMIAQCcIYQAAM78f1vAEI+I3PjsAAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "horse\n"
     ]
    }
   ],
   "source": [
    "class_names = ['airplane','automobile','bird','cat','deer',\n",
    "               'dog','frog','horse','ship','truck']\n",
    "transforms_cifar10 = datasets.CIFAR10(data_path,train=True,download=False,transform=transforms.Compose([\n",
    "    transforms.ToTensor(),\n",
    "    transforms.Normalize((0.4914, 0.4822, 0.4465),(0.2470, 0.2435, 0.2616))\n",
    "]))\n",
    "transforms_cifar10_val = datasets.CIFAR10(data_path,train=False,download=False,transform=transforms.Compose([\n",
    "    transforms.ToTensor(),\n",
    "    transforms.Normalize((0.4942, 0.4851, 0.4504),(0.2467, 0.2429, 0.2616))\n",
    "]))\n",
    "\n",
    "img_train,label_train = transforms_cifar10[99]\n",
    "import matplotlib.pyplot as plt\n",
    "plt.imshow(img_train.permute(1,2,0))\n",
    "plt.show()\n",
    "print(class_names[label_train])\n",
    "\n",
    "img_val,label_val = transforms_cifar10_val[99]\n",
    "import matplotlib.pyplot as plt\n",
    "plt.imshow(img_val.permute(1,2,0))\n",
    "plt.show()\n",
    "print(class_names[label_val])"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-10-19T02:45:06.474729300Z",
     "start_time": "2023-10-19T02:45:03.107014800Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "outputs": [
    {
     "data": {
      "text/plain": "tensor([[ 0.0764, -0.0739, -0.2225,  0.1142, -0.1043, -0.1616,  0.1194,  0.0947,\n         -0.1817,  0.0136]], grad_fn=<AddmmBackward0>)"
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 定义模型\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "class Net(nn.Module):\n",
    "    def __init__(self,n_chans=32):\n",
    "        super().__init__()\n",
    "        self.n_chans=n_chans\n",
    "        self.conv1 = nn.Conv2d(3,n_chans,kernel_size=3,padding=1)\n",
    "        self.conv2 = nn.Conv2d(n_chans,n_chans//2,kernel_size=3,padding=1)\n",
    "\n",
    "        self.fc1 = nn.Linear(8*8*n_chans//2,100)\n",
    "        self.fc2 = nn.Linear(100,32)\n",
    "        self.fc3 = nn.Linear(32,10)\n",
    "\n",
    "    def forward(self,x):\n",
    "        out = F.max_pool2d(torch.tanh(self.conv1(x)),2)\n",
    "        out = F.max_pool2d(torch.tanh(self.conv2(out)),2)\n",
    "\n",
    "        out = out.view(-1,8*8*self.n_chans//2)\n",
    "        out = torch.tanh(self.fc1(out))\n",
    "        out = torch.tanh(self.fc2(out))\n",
    "        out = self.fc3(out)\n",
    "        return out\n",
    "\n",
    "model = Net()\n",
    "model(img_val)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-10-19T04:47:40.230772500Z",
     "start_time": "2023-10-19T04:47:40.140750400Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "outputs": [],
   "source": [
    "import datetime\n",
    "def train_loop(n_epoch,model,optimizer,loss_fn,train_loader):\n",
    "    for i in range(1,n_epoch+1):\n",
    "        loss_train = 0.0\n",
    "        for imgs,labels in train_loader:\n",
    "            imgs,labels=imgs.cuda(),labels.cuda()\n",
    "            outputs = model(imgs)\n",
    "            loss = loss_fn(outputs,labels)\n",
    "            optimizer.zero_grad()\n",
    "            loss.backward()\n",
    "            optimizer.step()\n",
    "            loss_train+= loss.item()\n",
    "        if i==1 or i%10==0:\n",
    "            print('{}, Epoch:{}, 训练损失:{}'.format(datetime.datetime.now(),i,loss_train/len(train_loader)))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-10-19T04:47:49.636987500Z",
     "start_time": "2023-10-19T04:47:49.625980200Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2023-10-19 12:48:19.723271, Epoch:1, 训练损失:2.070065978847806\n",
      "2023-10-19 12:51:10.854262, Epoch:10, 训练损失:1.0694328893328566\n",
      "2023-10-19 12:54:19.753089, Epoch:20, 训练损失:0.8051255747790227\n",
      "2023-10-19 12:57:26.694272, Epoch:30, 训练损失:0.6354827952888006\n",
      "2023-10-19 13:00:36.006265, Epoch:40, 训练损失:0.4860573647843907\n",
      "2023-10-19 13:03:43.130555, Epoch:50, 训练损失:0.34396157146948375\n",
      "2023-10-19 13:06:52.218550, Epoch:60, 训练损失:0.21643854772953122\n",
      "2023-10-19 13:10:04.906512, Epoch:70, 训练损失:0.12144914408550238\n",
      "2023-10-19 13:13:17.661169, Epoch:80, 训练损失:0.06602881347660518\n",
      "2023-10-19 13:16:32.170076, Epoch:90, 训练损失:0.03888881701947478\n",
      "2023-10-19 13:19:48.821097, Epoch:100, 训练损失:0.025529912732484394\n"
     ]
    }
   ],
   "source": [
    "import torch.optim as optim\n",
    "train_loader = torch.utils.data.DataLoader(transforms_cifar10,shuffle=False,batch_size=64)\n",
    "model = Net().cuda()\n",
    "optimizer = optim.SGD(model.parameters(),lr=0.01)\n",
    "loss_fn = nn.CrossEntropyLoss()\n",
    "train_loop(n_epoch=100,model=model,loss_fn=loss_fn,optimizer=optimizer,train_loader=train_loader)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-10-19T05:19:48.827089800Z",
     "start_time": "2023-10-19T04:47:59.635638Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "outputs": [],
   "source": [
    "def test_loop(model,test_loader):\n",
    "    correct = 0\n",
    "    total = 0\n",
    "    with torch.no_grad():\n",
    "        for imgs,labels in test_loader:\n",
    "            imgs,labels = imgs.cuda(),labels.cuda()\n",
    "            outputs = model(imgs)\n",
    "            _,preds=torch.max(outputs,dim=1)\n",
    "            total+=labels.shape[0]\n",
    "            correct+= int((preds==labels).sum())\n",
    "    print('测试集精度:',correct/total)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-10-19T05:19:59.270092800Z",
     "start_time": "2023-10-19T05:19:59.257065300Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "测试集精度: 0.2985\n"
     ]
    }
   ],
   "source": [
    "test_loader = torch.utils.data.DataLoader(cifar10_val,shuffle=False,batch_size=64)\n",
    "test_loop(model,test_loader)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-10-19T05:21:17.398749500Z",
     "start_time": "2023-10-19T05:21:15.173722200Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 二分类"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "outputs": [],
   "source": [
    "class_names2 = ['ship','truck']\n",
    "label_map ={8:0,9:1}\n",
    "cifar2 = [(imgs,label_map[labels]) for imgs,labels in cifar10 if labels in [8,9]]\n",
    "cifar2_val = [ (imgs,label_map[labels])for imgs,labels in cifar10_val if labels in [8,9]]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-10-19T05:34:56.766215300Z",
     "start_time": "2023-10-19T05:34:46.176680200Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "outputs": [
    {
     "data": {
      "text/plain": "tensor([[ 0.1260, -0.0613]], grad_fn=<AddmmBackward0>)"
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "class Net_2(nn.Module):\n",
    "    def __init__(self,n_chans=32):\n",
    "        super().__init__()\n",
    "        self.n_chans=n_chans\n",
    "        self.conv1 = nn.Conv2d(3,n_chans,kernel_size=3,padding=1)\n",
    "        self.conv2 = nn.Conv2d(n_chans,n_chans//2,kernel_size=3,padding=1)\n",
    "\n",
    "        self.fc1 = nn.Linear(8*8*n_chans//2,32)\n",
    "        self.fc2 = nn.Linear(32,2)\n",
    "\n",
    "    def forward(self,x):\n",
    "        out = F.max_pool2d(torch.tanh(self.conv1(x)),2)\n",
    "        out = F.max_pool2d(torch.tanh(self.conv2(out)),2)\n",
    "\n",
    "        out = out.view(-1,8*8*self.n_chans//2)\n",
    "        out = torch.tanh(self.fc1(out))\n",
    "        out = self.fc2(out)\n",
    "        return out\n",
    "\n",
    "img,label = cifar2[99]\n",
    "model = Net_2()\n",
    "model(img)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-10-19T05:37:22.070709800Z",
     "start_time": "2023-10-19T05:37:22.048712100Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "truck\n"
     ]
    }
   ],
   "source": [
    "plt.imshow(img.permute(1,2,0))\n",
    "plt.show()\n",
    "print(class_names2[label])"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-10-19T05:38:16.591501400Z",
     "start_time": "2023-10-19T05:38:08.853791600Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2023-10-19 13:42:04.491170, Epoch:1, 训练损失:0.6701413214586343\n",
      "2023-10-19 13:42:11.483116, Epoch:10, 训练损失:0.35145934875224044\n",
      "2023-10-19 13:42:19.294135, Epoch:20, 训练损失:0.2609674495876215\n",
      "2023-10-19 13:42:27.144181, Epoch:30, 训练损失:0.22110719527978046\n",
      "2023-10-19 13:42:34.962117, Epoch:40, 训练损失:0.1950230853288037\n",
      "2023-10-19 13:42:42.794116, Epoch:50, 训练损失:0.175444750364419\n",
      "2023-10-19 13:42:50.577155, Epoch:60, 训练损失:0.15863761865788964\n",
      "2023-10-19 13:42:58.354146, Epoch:70, 训练损失:0.14344077170559555\n",
      "2023-10-19 13:43:06.172142, Epoch:80, 训练损失:0.12957921147251586\n",
      "2023-10-19 13:43:13.950158, Epoch:90, 训练损失:0.11677991802905016\n",
      "2023-10-19 13:43:21.784117, Epoch:100, 训练损失:0.10497897417302345\n"
     ]
    }
   ],
   "source": [
    "train_loader = torch.utils.data.DataLoader(cifar2,batch_size=64,shuffle=False)\n",
    "model = Net_2().cuda()\n",
    "optimizer = optim.SGD(model.parameters(),lr=0.01)\n",
    "train_loop(n_epoch=100,model=model,loss_fn=loss_fn,optimizer=optimizer,train_loader=train_loader)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-10-19T05:43:21.792148300Z",
     "start_time": "2023-10-19T05:42:01.906472400Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "测试集精度: 0.934\n"
     ]
    }
   ],
   "source": [
    "test_loader = torch.utils.data.DataLoader(cifar2_val,shuffle=False,batch_size=64)\n",
    "test_loop(model,test_loader)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-10-19T05:45:33.140755200Z",
     "start_time": "2023-10-19T05:45:32.846735500Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
